/*
*   热点管理模块
*/
#ifndef __BUC_HOTM__
#define __BUC_HOTM__

#include "datamanage.hpp"
#include <string>
#include <vector>
#include <ctime>
#include <unistd.h>

namespace cloud
{
    class HotManage
    {
        private:
            std::string _back_dir; //备份目录名称
            std::string _pack_dir; //压缩目录名称
            std::string _pack_suffix; //压缩文件后缀名称
            time_t _hot_time; //热点时间

        //是热点文件返回true 非热点返回false
        bool isHot(const std::string& filename)
        {
            FileUtil file(filename);
            time_t last_time = file.FileAccTime();
            time_t new_time = time(nullptr);
            if( (new_time-last_time) > _hot_time ) return false;
            return true;
        }

        public:
        HotManage()
        {
            Config* conf = Config::GetInstance();
            _back_dir = conf->GetBackDir();
            _pack_dir = conf->GetPackDir();
            _pack_suffix = conf->GetPackfileSuffix();
            _hot_time = conf->GetHotTime();
            //检查目录是否已经创建 没有则创建
            FileUtil(_back_dir).CreateDirectory();
            FileUtil(_pack_dir).CreateDirectory();
        }
        bool RunModule() //热点文件管理
        {
            while(true)
            {
                //1.浏览备份目录
                FileUtil backd(_back_dir);
                std::vector<std::string> dirarray;
                backd.ScanDirectory(&dirarray);
                //2.检查是否为非热点文件
                for(auto& f:dirarray)
                {
                    if(isHot(f)) continue;
                    //3.获取备份文件信息
                    BackupInfo info;
                    //服务器本地有备份文件 但是没有备份数据 则恢复备份数据
                    if(DataManager::GetInstance()->GetOneByRealpath(f,&info) == false)
                    {
                        BackupInfo tmp(f);
                        info = tmp; //将文件信息存入表后也给info赋值 方便后面使用
                        DataManager::GetInstance()->Insert(tmp);
                    }
                    
                    //4.对非热点文件进行压缩处理
                    FileUtil packfile(f);
                    if(packfile.Compress(info.pack_path) == false)
                    {
                        std::cout<<"RunModule(): compress error!"<<std::endl;
                        return false;
                    }
                    //5.删除源文件 修改备份信息
                    packfile.FileRemove();
                    info.pack_flag = true;
                    DataManager::GetInstance()->Update(info);
                }
                sleep(2); //10秒扫描一次
            }
            return true;
        }
    };
}

#endif